package com.ciaojian.bytedance.vo.bytedance;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class PayByteVo implements Serializable {

    /**
     * goods_list : [{"quantity":1,"price":100,"goods_title":"火锅团购","goods_image":"https://xxx","labels":"随时退|免预约","goods_id":"goods_1","goods_id_type":2,"discount_amount":19,"date_rule":"周一至周日可用","goods_page":{"path":"goods/infoxxxx","params":"{\"id\":\"xxxxxx\"}"},"order_valid_time":{"valid_duration":100000},"goods_book_info":{"book_type":2,"cancel_policy":1}}]
     * total_amount : 100
     * discount_amount : 20
     * app_id : tt07e3715e98c9aac0
     * phone_num : 19273654356
     * contact_name : 张三
     * extra : xxx
     * open_id : xxx
     * out_order_no : 132324
     * pay_notify_url : https://xxxx
     * pay_expire_seconds : 500
     * order_entry_schema : {"path":"pages/xxxindexxxx","params":"{\"id\":\"xxxxxx\"}"}
     * cp_extra : xxxxx
     */

    private Integer userId;
    //订单总价，单位分
    private int totalAmount;
    //开发者的单号，长度 <= 64 byte
    private String outOrderNo;
    //支付超时时间，单位秒，例如 300 表示 300 秒后过期；不传或传 0 会使用默认值 300。
    private int payExpireSeconds;
    //订单详情页信息，详情见order_entry_schema字段
    private OrderEntrySchemaBean orderEntrySchema;
    //开发者自定义透传字段，不支持二进制，长度 <= 2048 byte
    private String cpExtra;
    //商品信息，详情见goods_list字段
    private List<GoodsListBean> goodsList;


    //内部参数
    //优惠券码
    private String[] codes;
    //用户优惠id
    private Integer memberDiscountId;
    //服务类型
    private String type;

    @Data
    public static class OrderEntrySchemaBean implements Serializable {
        /**
         * path : pages/xxxindexxxx
         * params : {"id":"xxxxxx"}
         */
        //订单详情页跳转路径，没有前导的“/”，长度 <= 512byte
        private String path;
        //订单详情页路径参数，自定义的 json 结构，序列化成字符串存入该字段，平台不限制，但是写入的内容需要能够保证生成访问订单详情的 schema 能正确跳转到小程序内部的订单详情页，长度 <= 512byte
        private String params;
    }

    @Data
    public static class GoodsListBean implements Serializable {
        /**
         * quantity : 1
         * price : 100
         * goods_title : 火锅团购
         * goods_image : https://xxx
         * labels : 随时退|免预约
         * goods_id : goods_1
         * goods_id_type : 2
         * discount_amount : 19
         * date_rule : 周一至周日可用
         * goods_page : {"path":"goods/infoxxxx","params":"{\"id\":\"xxxxxx\"}"}
         * order_valid_time : {"valid_duration":100000}
         * goods_book_info : {"book_type":2,"cancel_policy":1}
         */

        //商品数量 //1
        private int quantity;
        //商品价格，单位（分）
        //注意：非 POI 商品必传
        private int price;
        //商品标题/商品名称，长度 <= 256 byte
        //注意：非 POI 商品必传
        private String goods_title;
        //商品图片链接，长度 <= 512 byte
        //注意：非 POI 商品必传
        private String goods_image;
        //商品标签，最多设置三个标签，例如：随时退｜免预约｜提前3日预约（“｜”是中文类型），详见 pay-button 支付 的 type 的合法值 部分，注意不是 good-type 的合法值。
        private String labels;
        //商品 id  //1
        private String goods_id;
        //商品 id 类别，
        //POI 商品传 1
        //非 POI 商品传 2
        private int goods_id_type;
        //折扣金额，单位分
        private int discount_amount;
        //使用规则，如 “周一至周日可用”、“周一至周五可用”、“非节假日可用”，默认“周一至周日可用”
        private String date_rule;
        //商品详情页，详情见goods_page字段
        private GoodsPageBean goods_page;
        //券的有效期，详情见order_valid_time字段
        //注意：
        //非 POI 商品必传，POI 商品会从 POI 库里查询有效期信息，不会使用开发者传的数据。
        //如果是非 POI 商品，每个 goods_id 都要传券的有效期信息，否则会下单失败。
        private OrderValidTimeBean order_valid_time;
        //预约信息，详情见goods_book_info字段
        //注意：需要预约的商品必传
        private GoodsBookInfoBean goods_book_info;

        @Data
        public static class GoodsPageBean implements Serializable {
            /**
             * path : goods/infoxxxx
             * params : {"id":"xxxxxx"}
             */

            //商品详情页路径，长度 <= 512byte
            private String path;
            //商品详情页路径参数，长度 <= 512byte
            private String params;
        }

        @Data
        public static class OrderValidTimeBean implements Serializable {
            /**
             * valid_duration : 100000
             */
            //券的有效期开始时间，单位毫秒，须大于 0
            private int valid_start_time;
            //券的有效期结束时间，单位毫秒，须大于 0，且须大于 valid_start_time 和当前时间
            private int valid_end_time;
            //1券的相对有效时间，单位毫秒，须大于 0
            //2与 valid_start_time、valid_end_time 组合，至少回传一个，否则会下单失败
            //3都合法优先使用 valid_start_time、valid_end_time 组合
            //4当 valid_duration 有效时，
            //  (1券的有效期开始时间 S = 订单支付完成时间
            //  (2券的有效期结束时间 E = 1天 + 向下按天截断（S + valid_duration)）。
            //例如：valid_duration = 86400000 ms（一天），S = 2021.1.1 6:00，E = 2021.1.3 00:00
            private int valid_duration;
        }

        @Data
        public static class GoodsBookInfoBean implements Serializable {
            /**
             * book_type : 2
             * cancel_policy : 1
             */

            //预约类型，
            //1：不需要预约
            //2：在线预约
            private int book_type;
            //取消政策
            //1：预约后不可取消
            //2：预约后可取消
            private int cancel_policy;
        }
    }
}
